//
//  HMHomeViewModel.swift
//  Weibo
//
//  Created by teacher on 2017/6/8.
//  Copyright © 2017年 teacher. All rights reserved.
//

import UIKit
import SDWebImage

//  封装首页的网络请求
class HMHomeViewModel: NSObject {
    //  数据源
    lazy var statusList: [HMStatusViewModel] = [HMStatusViewModel]()
    //  请求微博数据, 根据isUp判断之前上拉加载还是下拉刷新
    func loadData(isUp: Bool, callBack: @escaping (Bool, String)->()) {
        let token = HMUserAccountViewModel.sharedViewModel.userAccount?.access_token
        //  上拉加载使用的微博id
        var maxId: Int64 = 0
        //  下拉刷新使用的微博id
        var sinceId: Int64 = 0
        if isUp {
            //  上拉加载
            maxId = statusList.last?.status?.id ?? 0
            
            //  去除重复数据处理
            if maxId > 0 {
                maxId -= 1
            }
        } else {
            //  下拉刷新获取微博id
            sinceId = statusList.first?.status?.id ?? 0
        }
        var message = "没有加载到最新的微博数据"
        //  检查本地缓存数据
        let statusDicArray = HMStatusDAL.checkCacheData(maxId: maxId, sinceId: sinceId)
        if statusDicArray.count > 0 {
            print("有缓存数据")
            //  HMStatus.self: 表示获取class
            let modelArray = NSArray.yy_modelArray(with: HMStatus.self, json: statusDicArray) as! [HMStatus]
            //  把模型转成ViewModel
            var tempArray = [HMStatusViewModel]()
            //  遍历模型数组，转成ViewModel数组
            for model in modelArray {
                //  创建ViewModel
                let viewModel = HMStatusViewModel()
                //  ViewModel关联model
                viewModel.status = model
                //  添加到指定数组里面
                tempArray.append(viewModel)
            }
            
            if isUp {
                //  表示上拉加载，那么把数据添加到原有数据的后面
                self.statusList.append(contentsOf: tempArray)
            } else {
                //  表示下拉刷新，那么把数据放到数组的最前面
                self.statusList.insert(contentsOf: tempArray, at: 0)
            }
            //  判断获取的微博数据个数
            if tempArray.count > 0 {
                message = "加载了\(tempArray.count)条微博数据"
            }
            
            //  重新加载数据
            callBack(true, message)
            return
        }
        
        //  代码执行到此没有缓存数据从网络加载微博数据
        HMNetworkTools.sharedTools.requestStatuses(token: token!, maxId: maxId, sinceId: sinceId) { (response, error) in
            if error != nil {
                print("error: \(error!)")
                callBack(false, message)
                return
            }
            
            let dic = response as! [String: Any]
            //  通过字典获取微博数据
            let statusDicArray = dic["statuses"] as! [[String: Any]]
            
            //  缓存微博数据到本地
            HMStatusDAL.cacheData(statusDicArray: statusDicArray)
            
            //  HMStatus.self: 表示获取class
            let modelArray = NSArray.yy_modelArray(with: HMStatus.self, json: statusDicArray) as! [HMStatus]
            
            //  把模型转成ViewModel
            var tempArray = [HMStatusViewModel]()
            //  创建调度组
            let group = DispatchGroup()
            //  遍历模型数组，转成ViewModel数组
            for model in modelArray {
                //  创建ViewModel
                let viewModel = HMStatusViewModel()
                //  ViewModel关联model
                viewModel.status = model
                //  添加到指定数组里面
                tempArray.append(viewModel)
                
                
                //  判断微博数据是否有单张图片
                if model.pic_urls?.count == 1 {
                    //  图片地址
                    let imageUrl = model.pic_urls!.first!.thumbnail_pic!
                    //  把任务添加到调度组里面
                    group.enter()
                    //  原创微博配图个数为1，需要下载这个单张图片
                    SDWebImageManager.shared().loadImage(with: URL(string: imageUrl), options: [], progress: nil, completed: { (image, imageData, error, _, _, url) in
                        print("原创微博单张图片下载完成，\(url)")
                        //  图片下载完成，从调度组里面离开
                        group.leave()
                    })
                }
                
                if model.retweeted_status?.pic_urls?.count == 1 {
                    //  图片地址
                    let imageUrl = model.retweeted_status!.pic_urls!.first!.thumbnail_pic!
                    //  把任务添加到调度组里面
                    group.enter()
                    //  转发微博配图个数为1，需要下载这个单张图片
                    SDWebImageManager.shared().loadImage(with: URL(string: imageUrl), options: [], progress: nil, completed: { (image, imageData, error, _, _, url) in
                        print("转发微博单张图片下载完成，\(url)")
                        //  图片下载完成，从调度组里面离开
                        group.leave()
                    })
                }
                
            }
            
            //  赋值数据源
//            self.statusList = tempArray
            
            if isUp {
                //  表示上拉加载，那么把数据添加到原有数据的后面
                self.statusList.append(contentsOf: tempArray)
            } else {
                //  表示下拉刷新，那么把数据放到数组的最前面
                self.statusList.insert(contentsOf: tempArray, at: 0)
            }
            //  判断获取的微博数据个数
            if tempArray.count > 0 {
                message = "加载了\(tempArray.count)条微博数据"
            }
            
            
            //  只看调度组里面有没有任务，没有任务就回调这个闭包
            //  调度组任务执行完成后，回调闭包
            group.notify(queue: DispatchQueue.main, execute: {
                print("所有的单张图片都下载完成")
                //  重新加载数据
                callBack(true, message)
            })
            
        }
    }
}
